package com.lxyk.controller;

import com.lxyk.pojo.MainMenu;
import com.lxyk.service.HistoryService;
import com.lxyk.service.WorkerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.*;

@Controller
@RequestMapping("/main")
@Slf4j
public class MainMenuController {
    @Autowired
    private WorkerService workerService;
    @Autowired
    private HistoryService historyService;
    @Autowired
    private RedisTemplate redisTemplate;

    @RequestMapping("/mainMenu")
    @ResponseBody
    public List<MainMenu>mainMenus(){//我们要返回json而不是视图
        //如果要用redis要这样写
        //去redis里遍历 有没有key=mainMenu
        List<MainMenu> mainMenu1 = redisTemplate.opsForList().range("mainMenu", 0, -1);
        //判断是否为空
        if (mainMenu1==null || mainMenu1.size()==0){
            //redis没有数据
            log.info("redis没有数据，从数据库查询");
            List<MainMenu> list=new ArrayList<>();

            Map<Integer,Integer>map=new HashMap<>();
            //送水工的送水总数量
            historyService.queryHistory().forEach(h ->{//h 是自定义的
                //在history表中一个送水工可能有多次送水记录 要把它们加起来
                map.put(h.getWorkerId(),map.getOrDefault(h.getWorkerId(),0)+h.getSendWaterCount());
            });
            workerService.queryWorker().forEach(w ->{
                MainMenu mainMenu=new MainMenu();
                mainMenu.setWorkerName(w.getWorkerName());
                Integer count = map.get(w.getWid());//送水数量
                mainMenu.setSendWaterCount(count==null?0:count);
                list.add(mainMenu);
            });

            //把list数据添加到redis的集合 mainMenu1
            if (list.size()<12){
                mainMenu1.addAll(list);//数量小于12 直接全部输出即可
            }
            for (int i = 0; i < 12; i++) {
                mainMenu1.add(list.get(i));//如果数量大于12 则把前12条数据赋给新的list集合再输出这12条数据
            }

            //排序 下边就不要了
            Collections.sort(mainMenu1,(o1,o2)->{
                if (o1.getSendWaterCount()>o2.getSendWaterCount()){
                    return 1;
                }else if (o1.getSendWaterCount()<o2.getSendWaterCount()){
                    return -1;
                }else {
                    return 0;
                }
            });
            //redis没有数据时 把数据库查询到的数据设置到redis中 下次直接从redis取数据即可
            redisTemplate.opsForList().leftPushAll("mainMenu",mainMenu1);
        }else {
            //redis有查询的数据直接从redis拿
            log.info("从redis查询");
        }

        /*//根据送水总数量倒序排序
        Comparator com=new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof MainMenu && o2 instanceof MainMenu){
                    MainMenu mainMenu1=(MainMenu)o1;//强转
                    MainMenu mainMenu2=(MainMenu)o2;
                    return Integer.compare(mainMenu2.getSendWaterCount(),mainMenu1.getSendWaterCount());
                }else {
                    throw new RuntimeException("输入类型不匹配");
                }
            }
        };//记住用这个排序的时候Comparator com=new Comparator(){};整体是一个语句 后边要加一个分号 他不是方法也不是类 他是个接口
        Collections.sort(list,com);

        List<MainMenu>arrayList=new ArrayList<>();*/
            return mainMenu1;

    }
}
